﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entidades.Sistema;

namespace Mapping.Sistema
{
    public static class MappingOrdenProduccion
    {

        public static List<Entidades.Sistema.OrdenProduccion> ConsultarOrdenProduccion()
        {
            SqlCommand cmdOrdenProduccion = new SqlCommand();
            cmdOrdenProduccion.CommandText = "sp_ConsultarOrdenProduccion";
            cmdOrdenProduccion.CommandType = System.Data.CommandType.StoredProcedure;
            cmdOrdenProduccion.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            SqlDataReader drOrdenProduccion = cmdOrdenProduccion.ExecuteReader();
            List<Entidades.Sistema.OrdenProduccion> ColOrdenProduccion = new List<Entidades.Sistema.OrdenProduccion>();
            while (drOrdenProduccion.Read())
            {
                Entidades.Sistema.OrdenProduccion oOrden = new Entidades.Sistema.OrdenProduccion();
                Entidades.Sistema.Producto oProducto = new Entidades.Sistema.Producto();

                oOrden.cod_orden = Convert.ToInt32(drOrdenProduccion[0]);
                oProducto.cod_producto = Convert.ToInt32(drOrdenProduccion[1]);
                oProducto.nombre = drOrdenProduccion[2].ToString();

                switch (drOrdenProduccion[3].ToString())
                {
                    case "Crearda":
                        oOrden.stateOrden.EstadoCreada(oOrden);
                        break;
                    case "Cancelada":
                        oOrden.stateOrden.EstadoCancelada(oOrden);
                        break;
                    case "Iniciada":
                        oOrden.stateOrden.EstadoCancelada(oOrden);
                        break;
                    case "Interrumpida":
                        oOrden.stateOrden.EstadoInterrumpida(oOrden);
                        break;
                    case "Finalizada":
                        oOrden.stateOrden.EstadoFinalizada(oOrden);
                        break;
                }

                oOrden.cap_total = Convert.ToInt32(drOrdenProduccion[4]);
                oOrden.cap_utilizada = Convert.ToInt32(drOrdenProduccion[5]);
                oOrden.cap_disponible = Convert.ToInt32(drOrdenProduccion[6]);
                
                oOrden.fecha_orden = Convert.ToDateTime(drOrdenProduccion[7]);
                oOrden.fecha_inicio = Convert.ToDateTime(drOrdenProduccion[8]);
                oOrden.fecha_fin = Convert.ToDateTime(drOrdenProduccion[9]);

                oOrden.producto = oProducto;

                /*Agregar el detalle de orden*/
                ColOrdenProduccion.Add(oOrden);
            }
            return ColOrdenProduccion;
        }

        public static int CambiaEstadoOrden(Entidades.Sistema.OrdenProduccion oOrden)
        {
            SqlCommand cmdOrdenProduccion = new SqlCommand();
            cmdOrdenProduccion.CommandText = "sp_CambiaEstadoOrden";
            cmdOrdenProduccion.CommandType = System.Data.CommandType.StoredProcedure;
            cmdOrdenProduccion.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdOrdenProduccion.Parameters.Add("@cod_orden", System.Data.SqlDbType.Int).Value = oOrden.cod_orden;
            cmdOrdenProduccion.Parameters.Add("@estado", System.Data.SqlDbType.VarChar, 15).Value = oOrden.Estado;//aplicando state
            cmdOrdenProduccion.Parameters.Add("@audit_id_usuario", System.Data.SqlDbType.VarChar, 15).Value = oOrden.auditoria.USUARIO.IdUsuario;
            cmdOrdenProduccion.Parameters.Add("@audit_tipo", System.Data.SqlDbType.VarChar, 15).Value = oOrden.auditoria.TipoOperacion;
            cmdOrdenProduccion.Parameters.Add("@audit_fecha", System.Data.SqlDbType.DateTime).Value = oOrden.auditoria.FechaModificacion;
            int nro = Convert.ToInt32(cmdOrdenProduccion.ExecuteScalar());
            return nro;
        }

        public static int RegistrarOrdenProduccion(Entidades.Sistema.OrdenProduccion oOrdenProd)
        {

            int Maximo = 0;

            SqlCommand cmdMaxOrden = new SqlCommand();
            cmdMaxOrden.CommandText = "sp_ObtenerMaxixmoNroOrden";
            cmdMaxOrden.CommandType = System.Data.CommandType.StoredProcedure;
            cmdMaxOrden.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            SqlDataReader drOrdenMaximo = cmdMaxOrden.ExecuteReader();

            while (drOrdenMaximo.Read())
            {
                Maximo = Convert.ToInt32(drOrdenMaximo[0]);
            }

            Maximo = Maximo + 1;

            oOrdenProd.cod_orden = Maximo;

            SqlCommand cmdOrdenProduccion = new SqlCommand();
            cmdOrdenProduccion.CommandText = "sp_RegistrarOrdenProduccion";
            cmdOrdenProduccion.CommandType = System.Data.CommandType.StoredProcedure;
            cmdOrdenProduccion.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdOrdenProduccion.Parameters.Add("@cod_orden", System.Data.SqlDbType.Int).Value = oOrdenProd.cod_orden;
            cmdOrdenProduccion.Parameters.Add("@cod_producto", System.Data.SqlDbType.VarChar).Value = oOrdenProd.producto.cod_producto;
            cmdOrdenProduccion.Parameters.Add("@cap_total", System.Data.SqlDbType.VarChar).Value = oOrdenProd.cap_total;
            cmdOrdenProduccion.Parameters.Add("@cap_utilizada", System.Data.SqlDbType.Int).Value = oOrdenProd.cap_utilizada;
            cmdOrdenProduccion.Parameters.Add("@cap_disponible", System.Data.SqlDbType.VarChar).Value = oOrdenProd.cap_disponible;
            cmdOrdenProduccion.Parameters.Add("@fecha_orden", System.Data.SqlDbType.VarChar).Value = oOrdenProd.fecha_orden;
            cmdOrdenProduccion.Parameters.Add("@fecha_inicio", System.Data.SqlDbType.VarChar).Value = oOrdenProd.fecha_inicio;
            cmdOrdenProduccion.Parameters.Add("@fecha_fin", System.Data.SqlDbType.VarChar).Value = oOrdenProd.fecha_fin;
            cmdOrdenProduccion.Parameters.Add("@estado", System.Data.SqlDbType.VarChar).Value = oOrdenProd.stateOrden.DevolverEstado(); //se aplica el patron state
            cmdOrdenProduccion.Parameters.Add("@audit_id_usuario", System.Data.SqlDbType.VarChar).Value = oOrdenProd.auditoria.USUARIO.IdUsuario;
            cmdOrdenProduccion.Parameters.Add("@audit_tipo", System.Data.SqlDbType.VarChar).Value = oOrdenProd.auditoria.TipoOperacion;
            cmdOrdenProduccion.Parameters.Add("@audit_fecha", System.Data.SqlDbType.VarChar).Value = oOrdenProd.auditoria.FechaModificacion;

            int rowsAffected = cmdOrdenProduccion.ExecuteNonQuery();
            int retorno=0;

            retorno = Maximo;

            return retorno;
        }

        public static int ModificarOrdenProduccion(Entidades.Sistema.OrdenProduccion oOrdenProd)
        {

            SqlCommand cmdOrdenProduccion = new SqlCommand();
            cmdOrdenProduccion.CommandText = "sp_ModificarOrdenProduccion";
            cmdOrdenProduccion.CommandType = System.Data.CommandType.StoredProcedure;
            cmdOrdenProduccion.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdOrdenProduccion.Parameters.Add("@cod_orden", System.Data.SqlDbType.Int).Value = oOrdenProd.cod_orden;
            cmdOrdenProduccion.Parameters.Add("@cod_producto", System.Data.SqlDbType.VarChar).Value = oOrdenProd.producto.cod_producto;
            cmdOrdenProduccion.Parameters.Add("@cap_total", System.Data.SqlDbType.VarChar).Value = oOrdenProd.cap_total;
            cmdOrdenProduccion.Parameters.Add("@cap_utilizada", System.Data.SqlDbType.Int).Value = oOrdenProd.cap_utilizada;
            cmdOrdenProduccion.Parameters.Add("@cap_disponible", System.Data.SqlDbType.VarChar).Value = oOrdenProd.cap_disponible;
            cmdOrdenProduccion.Parameters.Add("@fecha_orden", System.Data.SqlDbType.VarChar).Value = oOrdenProd.fecha_orden;
            cmdOrdenProduccion.Parameters.Add("@fecha_inicio", System.Data.SqlDbType.VarChar).Value = oOrdenProd.fecha_inicio;
            cmdOrdenProduccion.Parameters.Add("@fecha_fin", System.Data.SqlDbType.VarChar).Value = oOrdenProd.fecha_fin;
            cmdOrdenProduccion.Parameters.Add("@audit_id_usuario", System.Data.SqlDbType.VarChar).Value = oOrdenProd.auditoria.USUARIO.IdUsuario;
            cmdOrdenProduccion.Parameters.Add("@audit_tipo", System.Data.SqlDbType.VarChar).Value = oOrdenProd.auditoria.TipoOperacion;
            cmdOrdenProduccion.Parameters.Add("@audit_fecha", System.Data.SqlDbType.VarChar).Value = oOrdenProd.auditoria.FechaModificacion;

            int nro = Convert.ToInt32(cmdOrdenProduccion.ExecuteScalar());
            return nro;
        }

        public static bool EliminarOrden(Entidades.Sistema.OrdenProduccion oOrden)
        {
            SqlCommand cmdOrden = new SqlCommand();
            cmdOrden.CommandText = "sp_EliminarOrdenProduccion";
            cmdOrden.CommandType = System.Data.CommandType.StoredProcedure;
            cmdOrden.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdOrden.Parameters.Add("@cod_orden", System.Data.SqlDbType.Int).Value = oOrden.cod_orden;
            cmdOrden.Parameters.Add("@audit_id_usuario", System.Data.SqlDbType.VarChar).Value = oOrden.auditoria.USUARIO.IdUsuario;
            cmdOrden.Parameters.Add("@audit_tipo", System.Data.SqlDbType.VarChar).Value = oOrden.auditoria.TipoOperacion;
            cmdOrden.Parameters.Add("@audit_fecha", System.Data.SqlDbType.VarChar).Value = oOrden.auditoria.FechaModificacion;
            cmdOrden.ExecuteNonQuery();
            return true;
        }
    }
}
